/**
 * operations.h nasce con l'intento di gestire AL LIVELLO PIÙ ALTO le operazioni di
 * 	\li aggiunta di un arco per un veicolo
 * 	\li rimozione di un arco per un veicolo
 * ogni chiamata a una di queste coinvolge concettualmente
 *  \li uno stato di un veicolo
 *  \li la matrice delle raccolte
 *  \li la taboo list associata a quel veicolo.
 * le due operazioni sono state estratte dalle vecchie posizioni (solution, los, vattelapesca)
 * poichè di utilizzo generale: difatti non solo LOS ne usa (sebbene sia il maggior utilizzatore)
 * ma anche la costruttiva per esempio, e in futuro le costruttive 'diversificanti' di LTM.
 * pertanto è opportuna la creazione di un file che svolga la gestione di tutti e soli gli eventi
 * che avvengono quando si è decisa una modifica atomica di un veicolo (aka un'aggiunta/rimozione).
 */

#ifndef OPERATIONS_H_
#define OPERATIONS_H_
#include <stdbool.h>
#include "edgeID.h"
#include "edgeGraph.h"
#include "vehicleState.h"
#include "gMatrix.h"
#include "tabooList.h"

/** Inserimento effettivo di uno e un solo arco dentro al percorso k-esimo.
 * La procedura ordina e sincronizza le varie sotto-procedure legate al compito, ovvero
 * 	\li modifica della matrice G di raccolta
 * 	\li modifica dello stato del k-esimo veicolo
 * 	\li modifica della taboo list del k-esimo veicolo
 * Assumendosi la verifica e la decisione di alcuni loro parametri, quali la reale possibilità di raccolta.
 *
 * Ora come ora è del tutto sperimentale.
 * Sempre a livello sperimentale è la macro VERBOSE dall'ovvio significato. Idealmente dovrebbe esser letta
 * durante la chiamata del programma xor da un file di configurazione (cosa che pat preferirebbe per semplicità).
 *
 * La validazione dell'EdgeID interessato avviene qua, senza effetti collaterali se il chiamante l'avesse già fatta.
 *
 * \pre i controlli TQOK (gli unici che possono vietare un ADD) vengono fatti dal chiamante =>
 * \post La procedura NON restituisce un successo booleano, perchè è sempre vera.
 *
 * @param p_edgeID riferimento all'arco da inserire in un percorso
 * @param p_edgeGraph riferimento agli scalari dell'arco p_edgeID
 * @param p_vehicleState stato associato al percorso in esame
 * @param p_gMatrix matrice delle raccolte per l'intero problema
 * @param k identificativo del veicolo che effettua l'operazione
 * @param p_tabooList stato taboo del veicolo interessato
 * @param now iterazione corrente per il confronto taboo
 * @param tenure numero di iterazioni, o turni, per cui l'arco inserito deve stare in tabooList.
 * @param g_intent misura l'intenzione di raccogliere oltre che attraversare
 */
void addEdgeOp(PedgeID p_edgeID, PedgeGraph p_edgeGraph, PvehicleState p_vehicleState,
				PGMatrix p_gMatrix, int k, PtabooList p_tabooList, TabooExpire now, int tenure, bool g_intent);

/** Rimozione effettiva di uno e un solo arco dentro al percorso k-esimo.
 * La procedura ordina e sincronizza le varie sotto-procedure legate al compito, ovvero
 * 	\li modifica della matrice G di raccolta
 * 	\li modifica dello stato del k-esimo veicolo
 * 	\li modifica della taboo list del k-esimo veicolo
 * Assumendosi la verifica e la decisione di alcuni loro parametri, quali la reale rimozione della raccolta.
 * 	( la raccolta viene tolta sse si è arrivati a zero percorrenze E si raccoglieva )
 *
 * Ora come ora è del tutto sperimentale.
 * Sempre a livello sperimentale è la macro VERBOSE dall'ovvio significato. Idealmente dovrebbe esser letta
 * durante la chiamata del programma xor da un file di configurazione (cosa che pat preferirebbe per semplicità).
 *
 * La validazione dell'EdgeID interessato avviene qua, senza effetti collaterali se il chiamante l'avesse già fatta.
 *
 * @param p_edgeID riferimento all'arco da togliere da un percorso
 * @param p_edgeGraph riferimento agli scalari dell'arco p_edgeID
 * @param p_vehicleState stato associato al percorso in esame
 * @param p_gMatrix matrice delle raccolte per l'intero problema
 * @param k identificativo del veicolo che effettua l'operazione
 * @param p_tabooList stato taboo del veicolo interessato
 * @param now iterazione corrente per il confronto taboo
 * @param tenure numero di iterazioni, o turni, per cui l'arco rimosso deve stare in tabooList.
 */
void removeEdgeOp(PedgeID p_edgeID, PedgeGraph p_edgeGraph, PvehicleState p_vehicleState,
				PGMatrix p_gMatrix, int k, PtabooList p_tabooList, TabooExpire now, int tenure);


#endif /* OPERATIONS_H_ */
